/**
 * AppController 控制器
 * 处理应用程序的 HTTP 请求
 */
import { Controller, Get, Post, Body, Query, Param, Headers } from '@nestjs/common';
// 导入服务以使用其业务逻辑方法
import { AppService, HttpService } from './app.service';
import { SomeService } from './app.service';
// 导入 Swagger 相关装饰器用于生成 API 文档
import { ApiTags, ApiOperation, ApiResponse, ApiBody, ApiQuery } from '@nestjs/swagger';

/**
 * @ApiTags('示例') - 为控制器添加 Swagger 标签，用于在文档中分类 API
 * @Controller('api') - 标记此类为控制器，不指定路径则默认为根路径
 */
@ApiTags('示例')
@Controller()
export class AppController {
  /**
   * 构造函数
   * @param appService - 通过依赖注入获取的 AppService 实例
   */
  constructor(
    private readonly appService: AppService,
    private readonly someService: SomeService
  ) { }

  //   private appService: AppService;

  // constructor(appService: AppService) {
  //   this.appService = appService;
  // }

  /**
   * GET 请求处理方法 - 获取欢迎信息
   * @returns {string} 欢迎信息字符串
   * @ApiOperation - 描述 API 操作的摘要信息
   * @ApiResponse - 描述 API 响应的状态码和说明
   */
  @Get('hello')
  @ApiOperation({ summary: '获取欢迎信息', description: '返回应用程序的欢迎信息' })
  @ApiResponse({ status: 200, description: '成功获取欢迎信息', type: String })
  getHello(): string {
    return this.appService.getHello();
  }

  /**
   * GET 请求处理方法 - 异步获取数据
   * @returns {Promise<string>} 异步操作结果
   * @ApiOperation - 描述 API 操作的摘要信息
   * @ApiResponse - 描述 API 响应的状态码和说明
   */
  @Get('async-data')
  @ApiOperation({ summary: '异步获取数据', description: '通过异步操作获取数据' })
  @ApiResponse({ status: 200, description: '成功获取数据', type: String })
  @ApiResponse({ status: 500, description: '服务器内部错误' })
  async getAsyncData() {
    return this.someService.doSomething();
    // 注意：在Fastify中，异常会被NestJS自动捕获并处理
  }

  /**
   * POST 请求处理方法 - 创建用户
   * @param user - 包含用户信息的请求体
   * @param user.name - 用户名
   * @param user.email - 用户邮箱
   * @returns {object} 创建的用户对象，包含随机生成的 ID 和创建时间
   * @ApiOperation - 描述 API 操作的摘要信息
   * @ApiBody - 描述请求体的结构和字段
   * @ApiResponse - 描述 API 响应的状态码和说明
   */
  @Post('user')
  @ApiOperation({ summary: '创建用户', description: '创建新用户并返回用户信息' })
  @ApiBody({
    description: '用户创建请求体',
    schema: {
      type: 'object',
      properties: {
        name: { type: 'string', description: '用户名' },
        email: { type: 'string', description: '用户邮箱' }
      },
      required: ['name', 'email']
    }
  })
  @ApiResponse({
    status: 201,
    description: '用户创建成功',
    schema: {
      type: 'object',
      properties: {
        id: { type: 'string', description: '用户唯一标识' },
        name: { type: 'string', description: '用户名' },
        email: { type: 'string', description: '用户邮箱' },
        createdAt: { type: 'string', format: 'date-time', description: '创建时间' }
      }
    }
  })
  @ApiResponse({ status: 400, description: '请求参数错误' })
  createUser(@Body() user: { name: string; email: string }) {
    return this.appService.createUser(user);
  }


  /**
   * GET 请求处理方法 - 获取用户列表（分页）
   * @param page - 页码，默认为1（可选）
   * @param limit - 每页数量，默认为10（可选）
   * @returns {object} 用户列表及分页信息
   * @ApiOperation - 描述 API 操作的摘要信息
   * @ApiQuery - 描述查询参数
   * @ApiResponse - 描述 API 响应的状态码和说明
   */
  @Get('users')
  @ApiOperation({ summary: '获取用户列表', description: '分页获取用户列表' })
  @ApiQuery({ name: 'page', type: Number, required: false, description: '页码' })
  @ApiQuery({ name: 'limit', type: Number, required: false, description: '每页数量' })
  @ApiQuery({ name: 'name', type: String, required: false, description: '用户名' })
  @ApiQuery({ name: 'email', type: String, required: false, description: '用户邮箱' })
  @ApiResponse({
    status: 200,
    description: '成功获取用户列表',
    schema: {
      type: 'object',
      properties: {
        data: {
          type: 'array',
          items: {
            type: 'object',
            properties: {
              id: { type: 'string', description: '用户唯一标识' },
              name: { type: 'string', description: '用户名' },
              email: { type: 'string', description: '用户邮箱' },
              createdAt: { type: 'string', format: 'date-time', description: '创建时间' }
            }
          }
        },
        total: { type: 'number', description: '总记录数' },
      }
    }
  })
  getUsers(@Query('page') page: number, @Query('limit') limit: number, @Query('name') name: string, @Query('email') email: string) {
    return this.appService.getUsers(page, limit, name, email);
  }

  /**
   * GET 请求处理方法 - 根据ID获取用户
   * @param id - 用户ID
   * @returns {object} 用户信息或null（如果不存在）
   * @ApiOperation - 描述 API 操作的摘要信息
   * @ApiResponse - 描述 API 响应的状态码和说明
   */
  @Get('users/:id')
  @ApiOperation({ summary: '根据ID获取用户', description: '根据用户ID获取用户详情' })
  @ApiResponse({
    status: 200,
    description: '成功获取用户信息',
    schema: {
      type: 'object',
      properties: {
        id: { type: 'string', description: '用户唯一标识' },
        name: { type: 'string', description: '用户名' },
        email: { type: 'string', description: '用户邮箱' },
        createdAt: { type: 'string', format: 'date-time', description: '创建时间' }
      }
    }
  })
  @ApiResponse({ status: 404, description: '用户不存在' })
  getUserById(@Param('id') id: string) {
    return this.appService.getUserById(id);
  }

  /**
   * GET 请求处理方法 - 获取请求头信息
   * @param authHeader - 授权请求头
   * @returns {object} 包含授权请求头的对象
   * @ApiOperation - 描述 API 操作的摘要信息
   * @ApiResponse - 描述 API 响应的状态码和说明
   */
  @Get('headers')
  @ApiOperation({ summary: '获取请求头信息', description: '获取Authorization请求头的值' })
  @ApiResponse({
    status: 200,
    description: '成功获取请求头信息',
    schema: {
      type: 'object',
      properties: {
        authHeader: { type: 'string', description: 'Authorization请求头的值' }
      }
    }
  })
  getHeaders(@Headers('authorization') authHeader: string) {
    return { authHeader };
  }
}

@ApiTags('猫')
@Controller()
export class CatsController {
  @Get('cat')
  @ApiOperation({ summary: '获取所有猫的信息', description: '该接口返回所有猫的信息' })
  @ApiResponse({ status: 200, description: '成功获取所有猫的信息', type: String })
  findAll() {
    return 'This action returns all cats';
  }
}

@ApiTags('HTTP')
@Controller()
export class HttpController {
  constructor(private readonly httpService: HttpService<{ get: (url: string) => Promise<any> }>) { }
  @Get('http')
  @ApiOperation({ summary: '发送HTTP请求', description: '该接口发送HTTP请求' })
  @ApiResponse({ status: 200, description: '成功发送HTTP请求', type: String })
  @ApiResponse({ status: 500, description: '服务器内部错误' })
  async httpRequest() {
    const response = await this.httpService.get('http://192.168.1.212:3003/api/public/token');
    console.log('response', response);
    return response;
  }
}